﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using Webbshop.ServiceReference1;

namespace Webbshop
{
    /// <summary>
    /// Samling med statiska funktioner
    /// </summary>
    public static class Functions
    {
        /// <summary>
        /// Hämta en slumpad produkt från en databas och returnera dess namn
        /// </summary>
        /// <returns></returns>
        public static Product GetRandomProduct()
        {
            // Hämta produkten från databasen via WCF
            DataRow dr; // Rad med Produkt
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                // Hämta antal Produkter i Databas och slumpa fram ett Index
                var dsProducts = proxy.GetProducts();
                var randomIndex = new Random().Next(dsProducts.Tables[0].Rows.Count);
                // Spara slumpad Produkt
                dr = dsProducts.Tables[0].Rows[randomIndex];
            }
            finally { proxy.Close(); }
            
            // Skapa Produkt baserad på raden ur DataSet:et
            var product = new Product
            {
                ID = int.Parse(dr["productId"].ToString()),
                Name = dr["name"].ToString(),
                ImageURL = dr["ImageURL"].ToString(),
                Description = dr["productDescription"].ToString(),
                StockStatus = int.Parse(dr["stockStatus"].ToString()),
                Category = dr["category"].ToString(),
                Price = int.Parse(dr["price"].ToString())
            };

            return product;
        }

        /// <summary>
        /// Hämtar sessionens varukorg. Om det inte finns någon varukorg så skapas den
        /// </summary>
        /// <param name="session">Sessionsvariabel för varukorg</param>
        /// <returns>En varukorg</returns>
        public static Cart GetCart(Cart session)
        {
            if (session != null)
                return session;
            else
                return new Cart { Products = new SortedList<Product,int>() };
        }

        /// <summary>
        /// Lägg till en produkt i en varukorg
        /// </summary>
        /// <param name="cart">Varukorg att lägga i</param>
        /// <param name="productId">ProduktId för Produkt att lägga till</param>
        /// <param name="rowIndex">radens index för Produkt att lägga till</param>
        /// <returns>Uppdaterad varukorg</returns>
        public static Cart AddToCart(Cart cart, string productId, int rowIndex)
        {
            // Hämta produkten från databasen via WCF
            DataSet ds;
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                ds = proxy.getTargetProduct(int.Parse(productId));
            }
            finally { proxy.Close(); }
            var dt = ds.Tables[0];
            var dr = dt.Rows[rowIndex];

            // Skapa Produkt baserad på raden ur DataSet:et
            var product = new Product
            {
                ID = int.Parse(dr["productId"].ToString()),
                Name = dr["name"].ToString(),
                ImageURL = dr["ImageURL"].ToString(),
                Description = dr["productDescription"].ToString(),
                StockStatus = int.Parse(dr["stockStatus"].ToString()),
                Category = dr["category"].ToString(),
                Price = int.Parse(dr["price"].ToString())
            };

            // Om Produkt finns, räkna upp med ett (1)
            if (cart.Products.Count > 0 && cart.Products.ContainsKey(product))
                cart.Products[product]++;
            // Annars lägg till Produkt
            else
                cart.Products.Add(product, 1);

            return cart;
        }

        /// <summary>
        /// Ta bort en produkt ur en varukorg
        /// </summary>
        /// <param name="cart">Varukorg att lägga i</param>
        /// <param name="int">Produktens index</param>
        /// <returns>Uppdaterad varukorg</returns>
        public static Product DeleteFromCart(Cart cart, int index)
        {
            var product = cart.Products.Keys[index];

            // Om Produkt finns
            if (cart.Products.Count > 0 && cart.Products.ContainsKey(product))
            {
                // Om det finns flera av Produkten
                if (cart.Products[product] > 1)
                    cart.Products[product]--;
                
                // Om bara en (1) Produkt finns
                else
                    cart.Products.Remove(product);
            }

            return product;
        }

        /// <summary>
        /// Genomför Köp av Produkter som ligger i Varukorgen
        /// </summary>
        /// <param name="cart">Varukorg att köpa</param>
        public static void BuyProducts(Cart cart)
        {
            // Kontrollera att det finns Produkter att köpa
            if (cart.Products.Count > 0)
            {
                ShoppeServiceClient proxy = new ShoppeServiceClient();
                try
                {
                    // Skapa Order
                    proxy.AddOrder(MyProfile.GetProfile().UserName, DateTime.Now);
                    proxy.Close();

                    // Hämta Order
                    proxy = new ShoppeServiceClient();
                    DataSet dsUser = proxy.GetOrdersByUser(MyProfile.GetProfile().UserName);
                    var orderId = int.Parse(dsUser.Tables[0].Rows[0]["orderID"].ToString());

                    // Lägg till varje Produkt i Beställning
                    foreach (var item in cart.Products)
                    {
                        proxy.AddProductToOrder(orderId, item.Key.ID, item.Value);
                    }
                }
                finally { proxy.Close(); }

                // Rensa Varukorg
                cart.Products.Clear();
            }
            
        }

        public static DataSet GetOrders()
        {
            DataSet dsOrders;
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                // Hämta Order
                dsOrders = proxy.GetOrders();
            }
            finally { proxy.Close(); }

            return dsOrders;
        }

        public static DataSet GetOrders(string user)
        {
            DataSet dsOrders;
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                // Hämta Order
                dsOrders = proxy.GetOrdersByUser(user);
            }
            finally { proxy.Close(); }

            return dsOrders;
        }

        public static DataSet GetOrderDetail(int order)
        {
            DataSet dsOrder;
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                // Hämta Order
                dsOrder = proxy.GetOrder(order);
            }
            finally { proxy.Close(); }

            return dsOrder;
        }

        public static DataSet GetProducts()
        {
            DataSet dsProducts;
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                // Hämta Order
                dsProducts = proxy.GetProductsSimple();
            }
            finally { proxy.Close(); }

            return dsProducts;
        }

        public static void UpdateStockStatus(int newAmount, int productId)
        {
            ShoppeServiceClient proxy = new ShoppeServiceClient();
            try
            {
                proxy.UpdateStockStatus(newAmount, productId);
            }
            finally { proxy.Close(); }
        }
    }
}